#include <assert.h>
#include "common/value.h"
#pragma once
class NullMap
{
public:
  NullMap() : bits_(0) {}
  NullMap(int bits) : bits_(bits) {}
  NullMap(const char* data) : bits_(0)
  {
    assert(data != nullptr);
    bits_ = *(reinterpret_cast<const int *>(data));
  }
  NullMap(vector<Value>& values)
  {
    bits_ = 0;
    for(int i = 0; i < values.size(); i++) {
      if (values[i].attr_type() == AttrType::NULLS) {
        set_null(i);
      }
    }
  }
  bool is_null(int id) const
  {
    assert(id >= 0 && id < 32);
    return (1 << id) & bits_;
  }
  void set_null(int id)
  {
    assert(id >= 0 && id < 32);
    bits_ |= (1 << id);
  }
  // void from_values(const std::vector<Value> &values)
  // {
  //   bits_ = 0;
  //   for(int i = 0; i < values.size(); i++) {
  //     if (values[i].attr_type() == AttrType::NULLS) {
  //       set_null(i);
  //     }
  //   }
  // }
  void set_not_null(int id)
  {
    assert(id >= 0 && id < 32);
    bits_ &= ~(1 << id);
  }
  
  int bits() const { return bits_; }
  const char* data() const
  {
    return reinterpret_cast<const char*>(&bits_);
  }
private:
  int bits_;  // 使用int类型来存储null位图，最多支持32个字段
};